package com.sfx.controller;
import com.sfx.component.UserComponent;
import com.sfx.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;

/**
 * 用户的控制器-->相当于安检器  控制用户的入口和出口  后端第一个就是通过Controller来接收(与前端打交道的第一层)
 */
@Controller
public class UserController {
    /**
     * controller里面读取UserService(在controller里面注入(读取)UserService)
     */

    //从Spring中读取(UserService)
    //1.属性注入   通过属性的方式从Spring中拿出来(读取出来)
    //2.构造方法注入
    //3.Setter注入

    //1.属性注入
    // 缺点 :
    //不能注入final修饰的对象
    //虽然使用简单,但只适用于IOC容器,代码移植性不好
    //更容易违反单一设计原则
//    @Autowired //自动装配
//    private  UserService userService;


    //2.Setter注入
//    //private  UserService userService;
//    @Autowired
//    public void setUserService(UserService userService) {
//        this.userService = userService;
//    }
    //符合单一设计原则(一个Set只注入一个对象)
    //依然不能注入final修饰的对象
    //注入的对象可能会被修改(因为Set方法可以被调用多次(存在被篡改的可能性))


    //3.构造方法注入
    private final UserService userService;//保证整个类里面所有的方法都可以使用
    private UserComponent userComponent;

    //当有多个构造方法的时候,要加上AutoWired
    @Autowired
    public UserController(UserService userService,UserComponent userComponent) {
        this.userService = userService;
        this.userComponent = userComponent;
    }

    //@Autowired                               //val没有在Spring中存
    public UserController(UserService userService) {
        System.out.println("--------------执行第二个构造方法-----------------");
        this.userService = userService;
    }

    //将当前bean 存储到Spring中
    public void doController(){
        //去调用UserService读取方法
        System.out.println("do Controller!!!");
        userService.doService();
        //userComponent.doUserComponent();
    }
}
